/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.senac.academicnet.model;

import br.com.senac.academicnet.model.entidades.ProfessorVO;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

class ProfessorDAO {
       
    static void incluir(ProfessorVO professor) throws Exception {



        String sql = "INSERT INTO Professores(nome, cpf, datanascimento, logradouro, numero, bairro, cidade, uf, telefone, celular, salario)"
                + " VALUES(?,?,?,?,?,?,?,?,?,?,?)";

        Connection conn = null;
        PreparedStatement pstm = null;

        try {
            // Cria uma conexão com o banco
            conn =  ConnectionJDBCFactory.getConexao();

            // Cria um PreparedStatment, classe usada para executar a query
            pstm = conn.prepareStatement(sql);
            
            carregarParametros(pstm, 1, professor);

            // Executa a sql para inserção dos dados
            pstm.execute();

        } finally {

            // Fecha as conexões

            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }

    static void alterar(ProfessorVO professor) throws Exception {

        String sql = "UPDATE Professores SET nome = ?, cpf = ?, datanascimento = ?, logradouro = ?, numero = ?, bairro = ?, cidade = ?, uf = ?, telefone = ?, celular = ?, salario = ?"
                + " WHERE codigo = ?";

        Connection conn = null;
        PreparedStatement pstm = null;

        try {
            // Cria uma conexão com o banco
            conn = ConnectionJDBCFactory.getConexao();

            // Cria um PreparedStatment, classe usada para executar a query
            pstm = conn.prepareStatement(sql);

            int indice = 1;
            indice = carregarParametros(pstm, indice, professor);
            pstm.setInt(indice++, professor.getCodigo());

            // Executa a sql para inserção dos dados
            pstm.execute();

        } finally {

            // Fecha as conexões

            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }

    static void deletar(ProfessorVO professor) throws Exception {

        String sql = "DELETE FROM Professores WHERE codigo = ?";

        Connection conn = null;
        PreparedStatement pstm = null;

        try {
            conn = ConnectionJDBCFactory.getConexao();

            pstm = conn.prepareStatement(sql);

            pstm.setInt(1, professor.getCodigo());

            pstm.execute();

        } finally {

            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }

    static void deletarTudo() throws Exception {

        String sql = "delete from professores";

        Connection conn = null;
        PreparedStatement pstm = null;

        try {
            conn = ConnectionJDBCFactory.getConexao();

            pstm = conn.prepareStatement(sql);
            
            pstm.execute();

        } finally {

            try {
                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }
    }
    
    static List<ProfessorVO> getProfessores() throws Exception {

        String sql;
        sql = "SELECT * FROM Professores";

        List<ProfessorVO> professores = new ArrayList<>();

        Connection conn = null;
        PreparedStatement pstm = null;
        // Classe que vai recuperar os dados do banco de dados
        ResultSet rset = null;

        try {
            conn = ConnectionJDBCFactory.getConexao();

            pstm = conn.prepareStatement(sql);

            rset = pstm.executeQuery();

            // Enquanto existir dados no banco de dados, faça
            while (rset.next()) {
                // Adiciono o professor recuperado, a lista de professores
                professores.add(carregarObjeto(rset));
            }

        } finally {

            try {

                if (rset != null) {

                    rset.close();
                }

                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }

        return professores;
    }
    
    static ProfessorVO getProfessor(int codigo) throws Exception {

        String sql;
        sql = "SELECT * FROM Professores where codigo =? ";

        ProfessorVO professor = new ProfessorVO();

        Connection conn = null;
        PreparedStatement pstm = null;
        // Classe que vai recuperar os dados do banco de dados
        ResultSet rset = null;

        try {
            conn = ConnectionJDBCFactory.getConexao();

            pstm = conn.prepareStatement(sql);
            
            pstm.setInt(1, codigo);

            rset = pstm.executeQuery();

            // Enquanto existir dados no banco de dados, faça
            while (rset.next()) {
                // Recupera o informacoes do banco e atribui ele ao objeto
                professor = carregarObjeto(rset);
            }

        } finally {

            try {

                if (rset != null) {

                    rset.close();
                }

                if (pstm != null) {

                    pstm.close();
                }

                if (conn != null) {
                    conn.close();
                }

            } catch (Exception e) {

                e.printStackTrace();
            }
        }

        return professor;
    }

    private static int carregarParametros(PreparedStatement pstm, int indice, ProfessorVO professor) throws SQLException {
        pstm.setString(indice++, professor.getNome());
        pstm.setLong(indice++, professor.getCpf());
        pstm.setDate(indice++, new java.sql.Date(professor.getDataNascimento().getTime()));
        pstm.setString(indice++, professor.getLogradouro());
        pstm.setString(indice++, professor.getNumero());
        pstm.setString(indice++, professor.getBairro());
        pstm.setString(indice++, professor.getCidade());
        pstm.setString(indice++, professor.getUf());
        pstm.setString(indice++, professor.getTelefone());
        pstm.setString(indice++, professor.getCelular());
        pstm.setDouble(indice++, professor.getSalario());
        
        return indice;
    }

    private static ProfessorVO carregarObjeto(ResultSet rset) throws SQLException {
        ProfessorVO professor = new ProfessorVO();
        // Recupera o informacoes do banco e atribui ele ao objeto
        professor.setCodigo(rset.getInt("codigo"));
        try {
            professor.setNome(rset.getString("nome"));
        } catch (Exception ex) {
        }
        professor.setCpf(rset.getLong("cpf"));
        professor.setDataNascimento(new java.util.Date(rset.getDate("datanascimento").getTime()));
        professor.setLogradouro(rset.getString("logradouro"));
        professor.setBairro(rset.getString("bairro"));
        professor.setNumero(rset.getString("numero"));
        professor.setCidade(rset.getString("cidade"));
        professor.setUf(rset.getString("uf"));
        professor.setTelefone(rset.getString("telefone"));
        professor.setCelular(rset.getString("celular"));
        professor.setSalario(rset.getDouble("salario"));
        return professor;
    }
}
